Probar el módulo de kernel más simple de LDD3 sin ninguna modificación en el kernel personalizado v4.1.0-rc6 para la placa Beagle Bone con BusyBox v1.23.0. El código del módulo es el siguiente:
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world\n"); } module_init(hello_init); module_exit(hello_exit);El archivo Make es:
ARCH := arm CROSS_COMPILE := arm-cortex_a8-linux-gnueabi- obj-m := hello.o all: make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) modules clean: make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) cleanEl módulo se está compilando e instalando en rootfs sin problemas. también está cargando:
$ insmod hello.ko [ 30.692404] Hello, worldPero al intentar eliminarlo, me sale:
$ rmmod hello.ko Segmentation fault $modprobe -r hello.ko Segmentation fault $ lsmod hello 813 0 - Live 0xbf000000 (O)El kernel está compilado con el soporte de descarga de módulos (tanto regular como forzado) habilitado.
¿Cuál puede ser la posible causa de este problema? ¿Cuál es la forma de abordar la investigación de la misma?
Actualizar:
Como se sugiere en los comentarios, he intentado incluir linux/kernel.h , definiendo los símbolos MODULE , LINUX y __KERNEL__ . Se agregaron los prefijos __init y __exit a las funciones. Se eliminaron los modificadores static . Se eliminaron las líneas de printk . El resultado el mismo. dmesg muestra solo el saludo inicial. Sorprendentemente, la carga y descarga de los módulos del kernel, como gpio_keys o crypto/ccm , funciona. Entonces, lo único que queda por sospechar es la forma en que se compila el módulo.
Actualización 2
Actualizar el kernel a la instantánea más reciente no ayudó. Compilado el módulo con diferentes configuraciones de optimización no ayudó. El siguiente paso, supongo, voy a modificar el rmmod de BusyBox para tener alguna indicación de la ubicación del problema.
Echa un vistazo a estos tutoriales:
http://www.tldp.org/HOWTO/Module-HOWTO/x839.html http://www.tldp.org/LDP/lkmpg/2.4/html/x281.htm
Intenta agregar:
#define MODULE #define LINUX #define __KERNEL__ #include <linux/kernel.h> /* Needed for KERN_ALERT */Me las he arreglado para solucionar este problema. Usando strace , descubrí que la falla de segmento está ocurriendo en algún lugar al read el archivo modules.dep.bb específico de BusyBox . BusyBox utiliza este archivo cuando se compila con la opción "Modutils simplificados" ( CONFIG_MODPROBE_SMALL ). Al deshabilitar la opción, seleccionar las utilidades que se instalarán y reconstruir BusybBox, obtuve el trabajo de descarga del módulo. Creo que la raíz del problema está cerca del hecho de que el módulo de prueba se compila y almacena fuera del directorio /lib/..../modules , por lo que la modutils busybox se está confundiendo.